// f[i][j]表示的集合是所有从(i, j)点为起点的所有路径
// 属性:f[i][j]表示路径的最大值

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

const int N = 310;
int f[N][N];
int h[N][N];
int n, m;
int dx[4] = {0, 1, 0, -1}, dy[4] = {1, 0, -1, 0};

int dp(int x, int y)
{
    int &v = f[x][y];
    // 如果已经计算过了，直接返回结果即可
    if (v)
        return v;
    // 最差的情况，可以滑过当前的一格
    v = 1;
    for (int i = 0; i < 4; ++i)
    {
        int xx = x + dx[i], yy = y + dy[i];
        if (xx >= 1 && xx <= n && yy >= 1 && yy <= m && h[xx][yy] < h[x][y])
            v = max(v, dp(xx, yy) + 1);
    }
    return v;
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);
    cin >> n >> m;
    for (int i = 1; i <= n; ++i)
        for (int j = 1; j <= m; ++j)
            cin >> h[i][j];
    int res = 0;
    for (int i = 1; i <= n; ++i)
        for (int j = 1; j <= m; ++j)
            res = max(res, dp(i, j));
    cout << res << endl;
    return 0;
}
